<?php
namespace Components\Account\Backstage;

class JWT extends \Phalcon\Di\Injectable {
	private $key = null;
	/**
	 * 设置token
	 **/
	public function setToken($payload) {
		/**
		 * jwt Header 参数解释
		 * alg(algorithm) : 加密算法。
		 *
		 * jwt Payload 参数解释
		 * aud(audience)   : 接收者。
		 * exp(expires in) : 什么时候过期(UNIX时间)。
		 * iat(issued at)  : 在什么时候签发的(UNIX时间)。
		 * iss(issuer)     : 该JWT的发行者/签发者。
		 * nbf(not before) : token在此时间之前不能被接收处理。
		 * sub(subject)    : 该JWT所面向的用户。
		 * jti(jwt ID)     : 为web token提供唯一标识
		 **/

		$currentTime = time();
		//$payload['aud'] = '';
		$payload['exp'] = $currentTime + 7200;
		$payload['iat'] = $currentTime;
		//$payload['iss'] = 'xfh';
		$payload['nbf'] = $currentTime;
		//$payload['sub'] = '';

		return \Jose\Factory\JWSFactory::createJWSToCompactJSON($payload, $this -> getKey(), [
			//'crit' => ['exp', 'aud'],
			'alg'  => 'HS512'
		]);
	}

	public function checkToken($token) {
		try {
			$jws = (new \Jose\Loader()) -> loadAndVerifySignatureUsingKey($token, $this -> getKey(), ['HS512']);

			//\Jose\Factory\CheckerManagerFactory::createClaimCheckerManager(['exp', 'iat', 'nbf']) -> checkJWS($jws, 0);
			\Jose\Factory\CheckerManagerFactory::createClaimCheckerManager(['iat', 'nbf']) -> checkJWS($jws, 0);
		} catch(\Exception $e) {
			return ['code' => -1, 'message' => $e -> getMessage()];
		}

		return ['code' => 0, 'message' => '验证成功！', 'payload' => $jws -> getPayload()];
	}

	public function getKey() {
		if(is_null($this -> key)) {
			if(file_exists(__DIR__.'/jwt_key')) {
				$key = json_decode(file_get_contents(__DIR__ . '/jwt_key'), true);
			} else {
				$key = \Jose\Factory\JWKFactory::createOctKey([
					'size' => 128
				]) -> getAll();

				file_put_contents(__DIR__ . '/jwt_key', json_encode($key));
			}

			$this -> key = \Jose\Factory\JWKFactory::createFromValues($key);
		}

		return $this -> key;
	}
}
